import { ref, onUnmounted } from 'vue'

/**
 * 轮询管理 Composable
 * 用于管理定时轮询任务
 */
export function usePolling() {
	const timer = ref<number | null>(null)
	const isUpdating = ref(false)

	/**
	 * 启动轮询
	 * @param callback 轮询回调函数
	 * @param interval 轮询间隔（毫秒），默认 2000ms
	 */
	function startPolling(callback: () => Promise<void> | void, interval: number = 2000) {
		// 清除已存在的定时器
		if (timer.value) {
			clearInterval(timer.value)
		}

		timer.value = window.setInterval(async () => {
			// 如果正在更新中，跳过本次轮询
			if (isUpdating.value) {
				return
			}
			await callback()
		}, interval)
	}

	/**
	 * 停止轮询
	 */
	function stopPolling() {
		if (timer.value) {
			clearInterval(timer.value)
			timer.value = null
		}
	}

	/**
	 * 执行更新操作（带锁保护）
	 * @param updateFn 更新函数
	 */
	async function executeUpdate(updateFn: () => Promise<void>) {
		if (isUpdating.value) {
			return
		}

		isUpdating.value = true
		try {
			await updateFn()
		} catch (error) {
			console.error('轮询更新失败:', error)
		} finally {
			isUpdating.value = false
		}
	}

	// 组件卸载时清除定时器
	onUnmounted(() => {
		stopPolling()
	})

	return {
		timer,
		isUpdating,
		startPolling,
		stopPolling,
		executeUpdate
	}
}

